from utils.electrode_ctrl import ElectrodeCtrl
import numpy as np
from time import sleep,time,perf_counter
from utils import pressure_recv_svr

# 22/July/2024: two boards line scan, adjust the scanning velocity, adding the pressure sensor

def sleep_us(us:float):
    sleep(us / 1_000_000)

# Function to busy-wait for a specified number of microseconds
def busy_wait_us(us: float):
    end_time = perf_counter() + us / 1_000_000  # Calculate end time in seconds
    while perf_counter() < end_time:
        pass  # Busy-wait loop

if __name__=='__main__':
    frame_open = np.zeros((8,8))
    elec = []

    N_threshold = 300  # Pressure threshold

    elec.append(ElectrodeCtrl('COM14', 115200, 'com')) # 2号板子（靠近风扇）
    elec.append(ElectrodeCtrl('COM15', 115200, 'com'))  # 1号板子（远离风扇）
    #elec.append(ElectrodeCtrl('COM13', 115200, 'com'))  # 1号板子（远离风扇）

    pattern = np.zeros((8,8))

    # Start the pressure sensor server
    pressure_recv_svr.start_pressure_recv_svr()

    while True:
        sleep(1e-7)
        pressure_g = pressure_recv_svr.global_data
        print(f'Detected Pressure: {pressure_g}')

        # Monitor the pressure sensor and apply the electro scanning stimulus once the pressure is greater than some threshold
        if pressure_g > N_threshold:
            for line in range(8):
                print(f'----------正在扫描第{line + 1}行--------------')
                print('持续扫描1s')
                count = 0

                start_time = perf_counter()  # Record the start time using perf_counter
                # start_time = time()  # 记录开始扫描该行的时间
                while perf_counter() - start_time < 0.07:  # 持续1秒钟
                    # 单点，从左扫到右
                    for i in range(8):
                        pattern[line, i] = 1
                        # print(pattern)
                        for index, board in enumerate(elec):
                            # 取消板子高阻态
                            board.on()
                            # print(f' 第{index + 1}个板子,第{i + 1}个电极点')
                            # print(pattern)
                            board.set_tick(pattern=pattern,
                                           pp=100,
                                           pw=50,
                                           pn=1,
                                           bp=100,
                                           pulse_type='neg'
                                           )

                            tick_start_time = perf_counter()
                            # print(tick_start_time)
                            busy_wait_us(100)  # Busy-wait for 10 microsecond
                            # sleep_us(1000)
                            tick_end_time = perf_counter()
                            # print(tick_end_time)
                            # pattern[line, i] = 0
                            board.off()

                            # Adjust sleep time based on time taken for other operations
                            tick_duration = tick_end_time - tick_start_time
                            # print(f"Board {index + 1}, Line {line + 1}, Electrode {i + 1}, Tick duration: {tick_duration}")
                        pattern[line, i] = 0

                        # print(f"Tick duration: {tick_duration}")

                    count += 1
                print(f'第{line + 1}行扫描完毕')
                print(f'第{line + 1}行扫描次数：{count}')

